﻿#pragma once

#include "VectorOperation.m.h"


RENUM()
enum class EMaterialVectorOperationType
{
    Add,                //将两个向量分量分别相加，输入两个向量，输出一个向量
    Subtract,           //将两个向量分量分别相减，输入两个向量，输出一个向量
    Multiply,           //将两个向量的分量分别相乘，输入两个向量，输出一个向量
    Divide,             //将两个向量分量分别相除，输入两个向量，输出一个向量
    AddAfterMultiply,   //将两个向量相乘后相加，输入三个向量，输出一个向量

    CrossProduct,       //计算两个向量的叉乘，输入两个向量，输出一个向量
    DotProduct,         //计算两个向量的点乘，输入两个向量，输出一个浮点数
    Project,            //计算一个向量在另一个向量上的投影，输入两个向量，输出一个向量
    Reflect,            //计算向量A关于法向量B的反射向量，输入两个向量，输出一个向量
    Refract,            //计算向量A在法向量B上的折射向量，输入两个向量和一个浮点数(折射率)，输出一个向量
    FaceForward,        //如果B和C向量的点积小于零，返回A向量，否则返回-A，输入三个向量，输出一个向量
                        //使用场景： C是法向量，B是视线向量(相机到顶点的向量)，A是任意向量
                        //当相机能看到三角形正面时，返回A，否则返回-A
    
    Distance,           //计算两个点的距离，输入两个向量，输出一个浮点数
    Normalize,          //将一个向量归一化，输入一个向量，输出一个向量
    Length,             //计算一个向量的长度，输入一个向量，输出一个浮点数
    Scale,              //将一个向量缩放，输入一个向量和一个浮点数，输出一个向量

    Absolute,           //将一个向量的分量取绝对值，输入一个向量，输出一个向量
    Minimum,            //将两个向量的分量取最小值，输入两个向量，输出一个向量
    Maximum,            //将两个向量的分量取最大值，输入两个向量，输出一个向量
    Floor,              //将一个向量的分量向下取整，输入一个向量，输出一个向量
    Ceil,               //将一个向量的分量向上取整，输入一个向量，输出一个向量
    Fraction,           //将一个向量的分量取小数部分，输入一个向量，输出一个向量
    Round,              //将一个向量的分量四舍五入，输入一个向量，输出一个向量
    Mod,                //将一个向量的分量取模，输入两个向量，输出一个向量
    Loop,               //将一个向量的分量在最大值和最小值中循环，输入三个向量，输出一个向量
    Snap,               //将一个向量的分量按照网格大小进行取整，输入两个向量，输出一个向量

    Sin,                //将一个向量的分量取正弦值，输入一个向量，输出一个向量
    Cos,                //将一个向量的分量取余弦值，输入一个向量，输出一个向量
    Tan,                //将一个向量的分量取正切值，输入一个向量，输出一个向量
};

namespace WHE
{
    CString ToString(EMaterialVectorOperationType InType);
}